import javax.xml.parsers.*; 
import org.w3c.dom.*; 
import org.xml.sax.*; 
import java.io.*; 

import edu.mit.csail.sdg.alloy4compiler.translator.A4Solution;
import edu.mit.csail.sdg.alloy4.Err;

//Cette classe est chargee de cree le fichier ALS a partir des donnees utilisateurs (GET ou POST)
public class EmploiDuTemps {

	A4Solution solution = null;

	public EmploiDuTemps(){
                System.out.println("EMPLOI DU TEMPS CREE");
	}

        //Methode qui genere le fichier ALS, lance le compilateur alloy, et retourne une A4Solution
        public A4Solution ajouterRendezVous(String[] get){

//construire le .ALS
		//XMLHandler.getRacine("ExempleDOM.xml");

		/*		
		Node premierePartieFix = ExempleDOM.getPartieFix("ExempleDOM.xml", "partieFix", 0);
		String premierePartieFixS = premierePartieFix.getTextContent();

		Node deuxiemePartieFix = ExempleDOM.getPartieFix("ExempleDOM.xml", "partieFix", 1);
		String deuxiemePartieFixS = deuxiemePartieFix.getTextContent();
		*/
		
		boolean detruit = new File(PlanbycoServer.CHEMINHTML + "aCompiler.als").delete();
		NodeList partiesFix = ExempleDOM.getPartiesFix(PlanbycoServer.CHEMINHTML + "ExempleDOM.xml", "partieFix");

		for (int i=0;i<partiesFix.getLength();i++){
			Node partieFix = partiesFix.item(i);
			String textContentPartieFix = partieFix.getTextContent();
			FileHandler.ecrire(PlanbycoServer.CHEMINHTML + "aCompiler.als", textContentPartieFix);
			if (i<partiesFix.getLength()-1){
				if (get.length>1){
					FileHandler.ecrire(PlanbycoServer.CHEMINHTML + "aCompiler.als", get[i].split("=")[1]);
				}else{
					FileHandler.ecrire(PlanbycoServer.CHEMINHTML + "aCompiler.als", "nonPrioritaire");
				}
			}
		}


		String reponse=""; 
//compiler le .ALS 
                try { 
	                this.solution = Compilateur.trouverSolution(new String[]{PlanbycoServer.CHEMINHTML + "aCompiler.als"}); 
                } 
                catch (Exception ex) { 
			System.out.println("Probleme Parsing"); 
		} 
		

//afficher le XML
		//String xml = lire(resCompil);
		//String MIME_HTML = "text/html";
		//String HTTP_OK = "200 OK";
		//new Response( HTTP_OK, MIME_HTML, "<html><head></head><body><p>"+xml+"</p><hr /></body></html>");
                return this.solution; 
        } 

	//Methode qui genere le fichier ALS, lance le compilateur alloy, et retourne une A4Solution
	public A4Solution ajouterContrainteSurProf(String[] get){
		for (int i=0;i<get.length;i++)
			System.out.println("HEY ! " + get[i]);

		boolean detruit = new File(PlanbycoServer.CHEMINHTML+"aCompiler.als").delete(); System.out.println("DETRUIT : " + detruit);
		NodeList partiesFixModele = ExempleDOM.getPartiesFix("ExempleDOM.xml", "partieFix");

		//On ecrit la premiere partie du modele edt-un-compose (sans contraintes)
		Node partieFixModele = partiesFixModele.item(0);
		String textContentPartieFix = partieFixModele.getTextContent();
		FileHandler.ecrire(PlanbycoServer.CHEMINHTML+"aCompiler.als", textContentPartieFix);

		//on cherche la contrainte demande et on rempli les trous
		NodeList partiesFixContrainte = ExempleDOM.getPartiesFix("contrainte.xml", "partieFix");
		for (int i=0;i<partiesFixContrainte.getLength();i++){
			Node partieFix = partiesFixContrainte.item(i);
			textContentPartieFix = partieFix.getTextContent();
			FileHandler.ecrire(PlanbycoServer.CHEMINHTML+"aCompiler.als", textContentPartieFix);
		System.out.println("SONDE");
			if (i<partiesFixContrainte.getLength()-1){
				//pour chaque trou, il y a une valeurs dans le get
				if (get.length>1){
					FileHandler.ecrire(PlanbycoServer.CHEMINHTML+ "aCompiler.als", get[i].split("=")[1]);
				}else{
					FileHandler.ecrire(PlanbycoServer.CHEMINHTML+ "aCompiler.als", "SONDE");
				}
			}
		}
		
		//On ecrit la derniere partie du modele edt-un-compose(le run{})
		partieFixModele = partiesFixModele.item(1);
		textContentPartieFix = partieFixModele.getTextContent();
		FileHandler.ecrire(PlanbycoServer.CHEMINHTML+"aCompiler.als", textContentPartieFix);


		String reponse=""; 
//compiler le .ALS 
                try { 
	                this.solution = Compilateur.trouverSolution(new String[]{PlanbycoServer.CHEMINHTML + "aCompiler.als"}); 
                } 
                catch (Exception ex) { 
			System.out.println("Probleme Parsing"); 
		} 
		

//afficher le XML
		//String xml = lire(resCompil);
		//String MIME_HTML = "text/html";
		//String HTTP_OK = "200 OK";
		//new Response( HTTP_OK, MIME_HTML, "<html><head></head><body><p>"+xml+"</p><hr /></body></html>");
                return this.solution; 
	}

	public A4Solution solutionSansContraintes(){
		boolean detruit = new File(PlanbycoServer.CHEMINHTML+"aCompiler.als").delete(); System.out.println("DETRUIT : " + detruit);
		NodeList partiesFixModele = ExempleDOM.getPartiesFix("ExempleDOM.xml", "partieFix");
		
		for (int i=0;i<partiesFixModele.getLength();i++){
			Node partieFix = partiesFixModele.item(i);
			String textContentPartieFix = partieFix.getTextContent();
			FileHandler.ecrire(PlanbycoServer.CHEMINHTML+"aCompiler.als", textContentPartieFix);
		}

//compiler le .ALS 
                try { 
	                this.solution = Compilateur.trouverSolution(new String[]{PlanbycoServer.CHEMINHTML + "aCompiler.als"}); 
                } 
                catch (Exception ex) { 
			System.out.println("Probleme Parsing"); 
		}
                return this.solution; 
	}

    public A4Solution afficherEmploiDuTemps(){ 
        try { 
            this.solution = Compilateur.trouverSolution(new String[]{PlanbycoServer.CHEMINALS+PlanbycoServer.CHEMINLIB+PlanbycoServer.ALLOYALS});
        }catch (Exception ex) { 
            System.out.println("Probleme : compilateur "); 
        } 
        return this.solution; 
    } 
        
    public A4Solution next() {
        A4Solution solTemporaire = this.solution;
        try { 
            solTemporaire = this.solution.next();
        }catch (Exception ex) { 
            System.out.println("Probleme Parsing next"); 
        }
        if (solTemporaire.satisfiable()){
            try { 
                solTemporaire.writeXML("alloy_example_output.xml");
                this.solution = solTemporaire;
            }catch (Exception execption){ 
                System.out.println("probleme ecriture fichier xml resultat de la compile alloy");
            }
            return solTemporaire;
        }else {
            System.out.println("next solution not satisfiable");
            return this.solution;
        }
    }
}
